package main

import "flag"

type CmdPara struct {
	ShadowFile  string // shadow文件路径
	Concurrency int    // 执行的并发数
	IsParallel  bool   // 是否并行多个破解任务
	RunMode     string // 运行模式，m为main（主控端）、w为worker（执行端）
	Workers     string // 执行端的IP列表，运行模式为m时才有意义
	Template    string /* 密码模板，由区块组成（中间英文逗号隔开），每个区块由字符描述和长度描述组成，
	字符描述包括d（数码）、c（小写字母）、C（大写字母）、m（英文常见符号）
	长度描述为一个数值或两个由减号隔开的数值，表示这段密码的长度或长度范围
	例如，d6表示6位纯数字，dcC8-10表示8~10位数字或大小写字母，d8,cC2,m5表示8位数字+2位大小写字母+5位英文符号
	*/
}

func ParseCmdPara() *CmdPara {
	para := &CmdPara{}

	flag.StringVar(&para.ShadowFile, "f", "/etc/shadow", "要破解的shadow文件")
	flag.IntVar(&para.Concurrency, "c", 20, "执行的并发数（负数表示按逻辑CPU的百分比）")
	flag.BoolVar(&para.IsParallel, "p", false, "是否并行多个破解任务（暂不支持）")
	flag.StringVar(&para.RunMode, "m", "m", "运行模式，m为主控端、w为执行端，用于协同工作")
	flag.StringVar(&para.Workers, "w", "", "执行端IP列表，用于协同工作派发任务")
	flag.StringVar(&para.Template, "t", "{{d6}}", "密码模板，格式为“...文本...{{替换模版}}...”，文本是固定内容、替换模板是可变内容，模板支持“[dcCm][N|N1-N2]”，d是数码、Cc是大小写字母、m是英文符号、N是固定长度、N1~N2是长度区间")
	flag.Parse()

	return para
}
